﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
// 原题连接：https://leetcode.cn/problems/remove-outermost-parentheses/
/*
题目描述：
有效括号字符串为空 ""、"(" + A + ")" 或 A + B ，其中 A 和 B 都是有效的括号字符串，+ 代表字符串的连接。
例如，""，"()"，"(())()" 和 "(()(()))" 都是有效的括号字符串。
如果有效字符串 s 非空，且不存在将其拆分为 s = A + B 的方法，我们称其为原语（primitive），其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 s，考虑将其进行原语化分解，使得：s = P_1 + P_2 + ... + P_k，其中 P_i 是有效括号字符串原语。
对 s 进行原语化分解，删除分解中每个原语字符串的最外层括号，返回 s 。

 

示例 1：
输入：s = "(()())(())"
输出："()()()"
解释：
输入字符串为 "(()())(())"，原语化分解得到 "(()())" + "(())"，
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。

示例 2：
输入：s = "(()())(())(()(()))"
输出："()()()()(())"
解释：
输入字符串为 "(()())(())(()(()))"，原语化分解得到 "(()())" + "(())" + "(()(()))"，
删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例 3：
输入：s = "()()"
输出：""
解释：
输入字符串为 "()()"，原语化分解得到 "()" + "()"，
删除每个部分中的最外层括号后得到 "" + "" = ""。
 

提示：
1 <= s.length <= 105
s[i] 为 '(' 或 ')'
s 是一个有效括号字符串
*/

// 开始解题：
char* removeOuterParentheses(char* s) {
    assert(s);
    int len = strlen(s);
    char* retStr = (char*)malloc(len * sizeof(char));
    if (NULL == retStr) {
        perror("malloc fail!\n");
        exit(-1);
    }
    char* stack = (char*)malloc((len / 2) * sizeof(char));
    if (NULL == stack) {
        perror("malloc fail!\n");
        exit(-1);
    }
    int i = 0;
    int top = 0;
    int n = 0;
    for (i = 0; i < len; i++) {
        if (')' == s[i]) {
            top--;
        }
        if (top > 0) {
            retStr[n] = s[i];
            n++;
        }
        if ('(' == s[i]) {
            stack[top] = s[i];
            top++;
        }
    }
    retStr[n] = '\0';
    free(stack);
    return retStr;
}